#ifndef __XLX_PROTOCOL_H__
#define __XLX_PROTOCOL_H__

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "xlx_common.h"

//------协议功能-------
//登录
#define CMD_LOGIN 0x01
//心跳
#define CMD_HEART 0x02
//同步时间
#define CMD_SYNCTIME 0x03
//上传gps
#define CMD_UPLOAD_GPS 0x04
//上传多个gps
#define CMD_UPLOAD_GPS_MORE 0x05
//上传lbs\wifi复合定位
#define CMD_UPLOAD_LBS 0x06
//上传声控报警
#define CMD_UPLOAD_AUDIO 0x07
//上传声控报警(支持文件格式)
#define CMD_UPLOAD_FORMAT_AUDIO 0x11
//上传报警
#define CMD_UPLOAD_ALERT 0x08
//字符指令
#define CMD_STRING_COMMAND 0x09
//数据透传，0：上传气压
#define CMD_TRANS_DATA 0x0a
//设备当前状态
#define CMD_DEVICE_STATUS 0x0b
//网络日志
#define CMD_NET_LOGGER 0x0c

//end-------------

//包体明文
#define FIXED_OPEN 0xf1
//包体加密
#define FIXED_SAFE 0xf2


//数据包头
#pragma pack(1)
typedef struct {
    u8 fixed;//起始位
    u8 cmd;//命令号
    u16 crc16;//校验码
    u16 seq;//序号
    u16 body_len;//包体长度
}TutuMsgHead;
#pragma pack()

//登录数据
#pragma pack(1)
typedef struct {
    BCD_t imei[8];
    BCD_t iccid[10];
    u16 deviceid;
    u32 soft_vercode;
}TutuMsgLogin;
#pragma pack()

//登录返回数据
#pragma pack(1)
typedef struct {
    u8 result;
    u32 utctime;
    u32 ip;
    u16 port;
}TutuMsgLoginRsp;
#pragma pack()

//心跳数据
#pragma pack(1)
typedef struct {
    u8 power;//电量百分比
    u8 satellites;//卫星数量
    u8 gsm;//电话卡信号百分比
    u8 device_state;//终端状态
}TutuMsgHeart;
#pragma pack()

//同步服务器时间回复数据
#pragma pack(1)
typedef struct {
    u8 result;
    u32 utctime;
}TutuMsgSyncTimeRsp;
#pragma pack()

//基站数据
#pragma pack(1)
typedef struct {
    u16 mcc;//国家代号
    u16 mnc;//移动网号码
    u16 lac;//位置区码
    u32 cellid;//移动基站 cell tower id
    s8 signal;//信号强度
}TutuMsgBaseStation;
#pragma pack()

//wifi数据
typedef struct {
    char mac[6];//mac地址
    u8 ssid_len;//ssid长度
    char* ssid;//ssid内容
    s8 signal;//信号强度
}TutuMsgWifi;

//蓝牙数据
typedef struct {
    char mac[6];//mac地址
    u8 bluetooth_len;//蓝牙名字长度
    char* bluetooth;//蓝牙名字
    s8 signal;//信号强度
}TutuMsgBluetooth;


#pragma pack(1)
typedef struct {
    u32 upload_time;//上传时间
    u64 lat;//纬度
    u64 lng;//经度
    u16 altitude;//海拔高度
    u8 satellites;//卫星数量
    u8 speed;//速度
    u16 state;//航向、状态
    u8 upload_mode;//上报模式 0:实时 1：补传
    u8 upload_type;//上报类型 0：定时上传 1：定距上传  2：拐点上传  3：ACC状态变化
    u8 base_station_size;//基站数量
    u8 wifi_size;//wifi数量
    u8 bluetooth_size;//蓝牙数量
}TutuMsgGpsBodyHead;
#pragma pack()

//GPS数据
typedef struct {
    TutuMsgGpsBodyHead head;
    TutuMsgBaseStation** station_list;
    TutuMsgWifi** wifi_list;
    TutuMsgBluetooth** blue_list;
}TutuMsgGps;



//报警数据
#pragma pack(1)
typedef struct {
    u8 power;//电量
    u8 satellites;//卫星数量
    u8 station_signal;//基站信号
    u32 upload_time;//报警时间
}TutuMsgAlert;
#pragma pack()


typedef struct {
    int bufsize;
    char* buf;
}TutuSndBuffer;

//气压数据
typedef struct {
    u8 channel;     //通道，默认0
    char version;   //版本，当前0
    u32 press;      //气压值(pa)
    s32 temp;       //温度值,实际值*10
    u8 satellites;  //卫星数量
    u16 altitude;   //海拔
    s8 floor;       //楼层

    u8 station_size;       //基站数量数量
    TutuMsgBaseStation** station_list;  //基站信息
    u8 wifi_size;       //wifi数量
    TutuMsgWifi** wifi_list;        //wifi信息
}TutuMsgAir;

#endif
